Skip to content

Conversation

daniekm
Copy link
Member

@daniekm daniekm commented Oct 15, 2026

Brings in development done in the private repository after the initial import,
and addresses peer review feedback:

  • Logo and "Søk" link scroll to top when already on the front page
  • Hero fills the viewport and browse rows are centered on wide screens
  • Search mode has a link back to browse and descriptive page titles

Claude and others added 30 commits October 6, 2026 17:48
Also corrects the relevance formula in docs/beslutninger.md.
A flat document with hundreds of aliased search or posterUrl fields passed depthLimit.
…(#15)

deleteReview only deletes reviews owned by the caller. Mutations are limited per user id and per client IP with token buckets.
Error link sets a reactive var on network failures (fetch error, 502/503/504, non-JSON), cleared on the next successful response. Layout shows one alert with NTNU VPN hint and a retry button; rows stay quiet meanwhile. Backend gets GET /health (SELECT 1, 2 s timeout), Apache proxies it, systemd unit restarts always and requires postgres.
…t queries (#15)

Normalized title columns use an IMMUTABLE unaccent wrapper. One- and two-character queries become prefix matches ranked by popularity.
Use Wants instead of Requires for postgresql.service. Map database connection errors to SERVICE_UNAVAILABLE and treat that code as downtime in the frontend. Banner moves focus to main after a successful retry and reports failed retries in a status region. Add pool connection timeout and strengthen the E2E retry test.
…anner (#13)

Reviewed: Wants= instead of Requires=, SERVICE_UNAVAILABLE for DB outages, focus and status feedback in the banner.
…-label

# Conflicts:
#	frontend/src/styles/global.css
…navigation (#14)

Reviewed: stable focus target for empty rows, flushSync covered by test, 320 px verified.
…efix search for short queries (#15)

Fullwidth characters are mapped to % and _ by unaccent, so escaping must happen after normalization. Queries of 1-2 characters now use a generated tsvector with GIN instead of whole-title prefix matching.
…and trust X-Forwarded-For only from loopback (#15)

Bind to 127.0.0.1 in production so port 3001 cannot be reached around Apache.
…itive and word-prefix search (#15)

Reviewed twice: memoized fragment traversal, normalize-then-escape, tsvector word prefix for short queries, loopback-only XFF trust.
Nicolay Kopaas and others added 27 commits October 8, 2026 13:35
Sluttgjennomgang: sikkerhet, tilgjengelighet, Lighthouse, enkel oppstart og ryddig struktur
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017WHmc5j7TieFWVZgP5reYk
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017WHmc5j7TieFWVZgP5reYk
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017WHmc5j7TieFWVZgP5reYk
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017WHmc5j7TieFWVZgP5reYk
Facets without a query are identical for every visitor but cost four
aggregations over the whole titles table on every request (search page
without text and every "Se alle" link). Keep them in a per-app TTL cache
(5 min, max 64 filter combinations, shared in-flight promise, errors not
cached). Facets with search text are never cached.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017WHmc5j7TieFWVZgP5reYk
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017WHmc5j7TieFWVZgP5reYk
- Expose the app's facet cache from setupApi and clear it in the cache test
- Assert minRating and availableOnly are part of the cache key
- Deduplicate filter arrays in facetCacheKey, with a unit test
- Rewrap the pre-computed table bullet in beslutninger.md

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017WHmc5j7TieFWVZgP5reYk
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017WHmc5j7TieFWVZgP5reYk

# Conflicts:
#	docs/ytelse.md
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017WHmc5j7TieFWVZgP5reYk
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017WHmc5j7TieFWVZgP5reYk
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017WHmc5j7TieFWVZgP5reYk
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017WHmc5j7TieFWVZgP5reYk
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017WHmc5j7TieFWVZgP5reYk
Brings in development done in the private repository after the initial import.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@daniekm daniekm requested a review from a team as a code owner October 15, 2026 10:45
Copy link
Member

@nicolaok nicolaok left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

@nicolaok nicolaok merged commit 9e1575f into main Oct 15, 2026
Sign in to join this conversation on GitHub.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants